#include <stdio.h>
#include <stdlib.h>
#include "squeue.h"

squeue *sq = NULL;

/**
 *@breif:创建循环队列
 *@author：马德顺
 */
squeue * queue_create()
{
	squeue *sq = NULL;
	if((sq = (squeue *)malloc(sizeof(squeue))) == NULL)
	{
		printf("malloc failed\n");
		return NULL;
	}

	sq->front = 0;
	sq->rear = 0;

	return sq;
}

/**
 *@breif:入队
 *@author：马德顺
 */
int enqueue(squeue *sq,struct sendEnv *p)
{
	//如果满了就从队头剔除一个
	if(queue_full(sq))
	{
		dequeue(sq);
		enqueue(sq,p);
		return -1;
	}
	sq->pData[sq->rear] = p;
	sq->rear = (sq->rear + 1) % N;
	return 0;
}

/**
 *@breif:判断是否满
 *@author：马德顺
 */
int queue_full(squeue *sq)
{
	return (sq->rear + 1) % N == sq->front;
}

/**
 *@breif:出队
 *@author：马德顺
 */
struct sendEnv *dequeue(squeue *sq)
{
	struct sendEnv *tmp;

	if(queue_empty(sq))
	{
		return NULL;
	}

	tmp = sq->pData[sq->front];
	free(tmp);
	sq->front = (sq->front + 1) % N;
	return tmp;
}

/**
 *@breif:判断是否空
 *@author：马德顺
 */
int queue_empty(squeue *sq)
{
	return sq->front == sq->rear;	
}

/**
 *@breif:重置
 *@author：马德顺
 */
void queue_clear(squeue *sq)
{
	sq->front = 0;
	sq->rear = 0;
}

/**
 *@breif:释放
 *@author：马德顺
 */
void queue_free(squeue *sq)
{
	free(sq);
	sq = NULL;
}
